﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace OEMS
{
    public static class MotorDB
    {
        public static void AddMotorGegevens(Motor motor)
        {
            /// <summary>
            /// Motor gegevens opslaan
            /// </summary>
            /// <param name="gegevensMotor">doorgegeven gegevens</param>
            /// <author>Robin Goris</author>

            using (SqlConnection connection = OemsDB.GetConnection())
            {
                connection.Open();

                SqlCommand insertCommand = connection.CreateCommand();
                SqlTransaction transaction;

                transaction = connection.BeginTransaction("MotorTransaction");
                insertCommand.Connection = connection;
                insertCommand.Transaction = transaction;

                try
                {
                    string insertStatement = " INSERT Gegevens_Motor " +
                        "( Klasse , Nominaal_vermogen , Nominaal_toerental , Datum_ingebruikname, GegevensID ) " +
                        "VALUES ( @Klasse , @Nominaal_vermogen , @Nominaal_toerental , @Datum_ingebruikname, @GegevensID ) ";
                    insertCommand.CommandText = insertStatement;

                    insertCommand.Parameters.AddWithValue("@Klasse", motor.Klasse);
                    insertCommand.Parameters.AddWithValue("@Nominaal_vermogen", motor.NominaalVermogen);
                    insertCommand.Parameters.AddWithValue("@Nominaal_toerental", motor.NominaalToerental);
                    insertCommand.Parameters.AddWithValue("@Datum_ingebruikname", motor.Ingebruikname);
                    insertCommand.Parameters.AddWithValue("@GegevensID", motor.GegevensId);
                    insertCommand.ExecuteNonQuery();

                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    try
                    {
                        transaction.Rollback();
                    }
                    catch (Exception ex2)
                    {
                        throw ex2;
                    }
                    throw ex;
                }
                finally
                {
                    connection.Close();
                }
            }
        }


        /// <summary>
        /// Geeft een motor terug adhv een gegevensId
        /// </summary>
        /// <param name="gegevensId">GegevensId van de motor</param>
        /// <returns>Een motor</returns>
        /// <author>Ronald Geladé</author>
        public static Motor GetMotorFromId(int gegevensId)
        {
            /// <summary>
            /// Motor opvragen aan de hand van een gegevensId
            /// </summary>
            /// <param name="gegevensId">gegevensId van de motor</param>
            /// <author>Ronald Geladé</author>

            Motor motor = new Motor();
            SqlConnection connection = OemsDB.GetConnection();
            string selectStatement =
                "SELECT Nominaal_vermogen, Nominaal_toerental, Klasse, " +
                "Datum_ingebruikname, GegevensID " +
                "FROM Gegevens_Motor " +
                "WHERE GegevensID = " + gegevensId;
            SqlCommand selectCommand = new SqlCommand(selectStatement, connection);

            try
            {
                connection.Open();
                SqlDataReader reader = selectCommand.ExecuteReader();
                while (reader.Read())
                {
                    motor.NominaalVermogen = (decimal)reader["Nominaal_vermogen"];
                    motor.NominaalToerental = (decimal)reader["Nominaal_toerental"];
                    motor.Klasse = reader["Klasse"].ToString();
                    motor.Ingebruikname = (DateTime)reader["Datum_ingebruikname"];
                    motor.GegevensId = (int)reader["GegevensID"];
                }
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
            }

            return motor;
        }

        /// <summary>
        /// zoeken welke motorID bij de meting hoort
        /// </summary>
        /// <param name="klasse">klasse en vermogen van de motor</param>
        /// <author>Robin Goris</author>
        public static Motor GetGegegevensId(string klasse, decimal vermogen)
        {
            Motor motor = new Motor();

            SqlConnection connection = OemsDB.GetConnection();
            string selectStatement = " SELECT * FROM Gegevens_Motor WHERE Klasse = @Klasse AND Nominaal_vermogen = @Nominaal_vermogen";
            SqlCommand selectCommand = new SqlCommand(selectStatement, connection);
            selectCommand.Parameters.AddWithValue("@Klasse", klasse);
            selectCommand.Parameters.AddWithValue("@Nominaal_vermogen", vermogen);
            try
            {

                connection.Open();
                SqlDataReader reader = selectCommand.ExecuteReader();
                if (reader.Read())
                {
                    motor.Klasse = reader["Klasse"].ToString();
                    motor.NominaalToerental = (decimal)reader["Nominaal_toerental"];
                    motor.NominaalVermogen = (decimal)reader["Nominaal_vermogen"];
                    motor.Ingebruikname = (DateTime)reader["Datum_ingebruikname"];
                    motor.GegevensId = Convert.ToInt32(reader["GegevensID"]);
                    
                }
                reader.Close();
            }
            catch (SqlException Exception)
            {
                throw Exception;
            }
            finally
            {

                connection.Close();
            }

            return motor;
        }

        /// <summary>
        /// Geeft een list van alle motoren uit de database terug
        /// </summary>
        /// <returns>List van alle motoren uit de database</returns>
        /// <author>Ronald Geladé</author>
        public static List<Motor> GetMotors()
        {
            List<Motor> motorList = new List<Motor>();
            SqlConnection connection = OemsDB.GetConnection();
            string selectStatement =
                "SELECT Nominaal_vermogen, Nominaal_toerental, Klasse, " +
                "Datum_ingebruikname, GegevensID " +
                "FROM Gegevens_Motor";
            SqlCommand selectCommand = new SqlCommand(selectStatement, connection);

            try
            {
                connection.Open();
                SqlDataReader reader = selectCommand.ExecuteReader();
                while (reader.Read())
                {
                    Motor motor = new Motor();
                    motor.NominaalVermogen = (decimal)reader["Nominaal_vermogen"];
                    motor.NominaalToerental = (decimal)reader["Nominaal_toerental"];
                    motor.Klasse = reader["Klasse"].ToString();
                    motor.Ingebruikname = (DateTime)reader["Datum_ingebruikname"];
                    motor.GegevensId = (int)reader["GegevensID"];
                    motorList.Add(motor);
                }
            }
            catch (SqlException ex)
            {
            throw ex;
            }
            finally
            {
                connection.Close();
            }

            return motorList;
        }
    }
}
